package com.bnz.proxy.dynamic;

import com.bnz.dao.UserDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理对象（JDK实现的动态代理）提高目标对象的能力
 */
public class UserDaoJDKDynamicImpl implements InvocationHandler {
    // 1. 得到目标对象
    private UserDao userDao;
    public UserDaoJDKDynamicImpl(UserDao userDao){
        this.userDao = userDao;
    }
    // 2. 生成代理对象
    public UserDao createProxy(){
        /**
         * 三个参数：
         * ①代表目标对象的类加载器
         * ②代表目标对象实现的所有接口的集合
         * ③代表实现了InvocationHandler的对象
         */
        return (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
                userDao.getClass().getInterfaces(),this);
    }
    // 3. 调用目标对象的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 3.1 如果调用add方法就调用测试方法
        if (method.getName().equals("add")){
            this.cs();
        }
        // 3.2 调用目标对象的其他方法
        return method.invoke(userDao,args);
    }
    // 4. 自己写一个方法测试JDK实现的动态代理
    private void cs(){
        System.out.println("JDK实现的动态代理!");
    }
}
